<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    var threeSum = function(nums) {
      let ans = [];
      let len = nums.length;
      if (len<3) return ans;
      // 先从小到大排序
      nums.sort((a, b) => {
          return a-b;
      });
      for (let i=0; i<len; i++) {
          // 如果此时i已经大于0了，那后面左右指针肯定也大于0，相加就不可能为0了，直接跳出循环
          if (nums[i]>0) break;
          if (i>0 && nums[i-1] ==nums[i]) continue; // 去重
          let L = i+1;
          let R = len-1;
          while(L < R) {
              let sum = nums[i] + nums[L] + nums[R];
              if (sum == 0) {
                  ans.push([nums[i], nums[L], nums[R]]);
                  // 如果L的后一个值跟当前值一样，直接右移
                  while(L<R && nums[L] == nums[L+1]) L++;
                  // 如果R前一个跟当前值一样，直接左移
                  while(L<R && nums[R] == nums[R-1]) R--;
                  // 保证跳过重复值之后，再移动到下一个就是不重复的值了
                  L++;
                  R--;
              } 
              else if (sum < 0) L++;
              else if (sum > 0) R--;
          }
      }
      return ans;
  };
  </script>
</body>
</html>